/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package byblos.apresentacao.objeto;

import byblos.apresentacao.idioma.InterceptadorIdioma;
import byblos.apresentacao.usuario.InterceptadorLogin;
import byblos.negocio.Idioma;
import byblos.negocio.NegocioExcecao;
import byblos.negocio.acomodacao.Acomodacao;
import byblos.negocio.acomodacao.CategoriaAcomodacao;
import byblos.negocio.acomodacao.TipoAcomodacao;
import byblos.negocio.acomodacao.TipoTemporada;
import byblos.negocio.objeto.Objeto;
import byblos.negocio.objeto.TipoObjeto;
import byblos.negocio.pacote.Pacote;
import byblos.negocio.pacote.PacoteAberto;
import byblos.negocio.pacote.PacoteFechado;
import byblos.negocio.pacote.TipoPacote;
import byblos.persistencia.DAO;
import byblos.util.MultipartRequestInterceptor;
import byblos.util.StringUtil;
import byblos.util.Util;
import java.awt.Dimension;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import org.vraptor.annotations.Component;
import org.vraptor.annotations.In;
import org.vraptor.annotations.InterceptedBy;
import org.vraptor.annotations.Out;
import org.vraptor.annotations.Parameter;
import org.vraptor.interceptor.UploadedFileInformation;

/**
 *
 * @author Marco Aurélio
 */
@Component
@InterceptedBy(value = {InterceptadorIdioma.class, InterceptadorLogin.class, MultipartRequestInterceptor.class})
public class ObjetoSalvarComponent {

//    @In
//    private Usuario usuario;
    @Parameter
    private int id;
    @Parameter
    private String nome;
    @Parameter
    private boolean ativo;
    @Parameter
    private String tituloDescricao;
    @Parameter
    private String descricao;
    @Parameter
    private String nomeBotao;
    @Parameter
    private TipoObjeto tipo;
    @Parameter
    private Idioma idioma;
    @Parameter
    private int categoriaId;
    @In(required = false)
    private UploadedFileInformation display;
    @In(required = false)
    private UploadedFileInformation foto;
    @Parameter
    private String descricaoFoto;
    @In
    private HttpServletRequest request;
    @Parameter
    private TipoPacote tipoPacote;
    @Parameter
    private String textoHome;
    @Parameter
    private String textoCondicoes;
    @Parameter
    private boolean visivelHome;
    @Parameter
    private int numeroNoites;
    @Parameter
    private Calendar dataInicio;
    @Parameter
    private Calendar dataTermino;
    @Parameter
    private Calendar dataCheckin;
    @Parameter
    private Calendar dataCheckout;
    @Parameter
    private boolean exclusividadeReserva;
    @Out
    private String mensagemSucesso;
    @Out
    private String mensagemErro;

    public String salvar() {
//        boolean adicao = id == 0;
        boolean fotoAcima2Mb = false;
        boolean adicionouImagem = false;
        Objeto objeto = construirObjeto();
//        if(objeto.getTipo() == TipoObjeto.PACOTE){
//            if(!(usuario.getCategoria() == CategoriaUsuario.ADMINISTRADOR)){
//                mensagemErro = "Usuário sem permissão para tal tarefa!";
//                return "semPermissao";
//            }
//        }
        //Objeto objetoAntigo = null;

//        if (objeto.getId() > 0) {
//            objetoAntigo = new DAO().localizar(Objeto.class, objeto.getId());
//            objeto.setDisplay(objetoAntigo.getDisplay());
//            objeto.setGaleria(objetoAntigo.getGaleria());
//        }

        if (display != null) {
            String caminhoRelativoDisplay = Util.salvarArquivo(request, "display", display, false, null);
            System.out.println("caminhoRelativoDisplay " + caminhoRelativoDisplay);
            objeto.setDisplay(caminhoRelativoDisplay);
            adicionouImagem = true;
        }
        if (foto != null) {
            if (foto.getFile().length() > 2097152) {
                fotoAcima2Mb = true;
            } else {
                String nomeArquivo = Util.removerAcentos(foto.getFileName());
                String caminhoRelativoFoto = Util.salvarArquivo(request, "galeria", foto, true, new Dimension(800, 600));
                System.out.println("caminhoRelativoFoto " + caminhoRelativoFoto);
                System.out.println("descricao foto     " + descricaoFoto);
                System.out.println("objeto     " + objeto);
                System.out.println("galeria    " + objeto.getGaleria());
                descricaoFoto = StringUtil.formatarTextoFckEditor(descricaoFoto);
                objeto.getGaleria().adicionarFoto(caminhoRelativoFoto, nomeArquivo, descricaoFoto);
                adicionouImagem = true;
            }
        }

        if (objeto.getTipo() == TipoObjeto.ACOMODACAO) {
            Acomodacao acomodacao = (Acomodacao) objeto;
            if (categoriaId > 0) {
                acomodacao.setCategoria(new DAO().localizar(CategoriaAcomodacao.class, categoriaId));
            } else {
                acomodacao.setCategoria(null);
            }
        } else if (objeto.getTipo() == TipoObjeto.PACOTE) {
            Pacote pacote = (Pacote) objeto;
            if (objeto instanceof PacoteAberto) {
                PacoteAberto pacoteAberto = (PacoteAberto) objeto;
                pacoteAberto.setDataInicio(dataInicio);
                pacoteAberto.setDataTermino(dataTermino);
                pacoteAberto.setNumeroNoites(numeroNoites);
            } else if (objeto instanceof PacoteFechado) {
                PacoteFechado pacoteFechado = (PacoteFechado) objeto;
                pacoteFechado.setCheckin(dataCheckin);
                pacoteFechado.setCheckout(dataCheckout);
            }
            pacote.setVisivelHome(visivelHome);
            textoHome = StringUtil.substituir(textoHome, "\n", "");
            textoHome = StringUtil.substituir(textoHome, "\r", "");
            pacote.setTextoHome(textoHome);
            textoCondicoes = StringUtil.substituir(textoCondicoes, "\n", "");
            textoCondicoes = StringUtil.substituir(textoCondicoes, "\r", "");
            pacote.setTextoCondicoes(textoCondicoes);
            pacote.setExclusividadeReserva(exclusividadeReserva);


//            if (adicao) {
////                List<CategoriaAcomodacao> categorias = new DAO().listar(CategoriaAcomodacao.class);
////                for (CategoriaAcomodacao categoria : categorias) {
////                    pacote.adicionarItem(categoria);
////                }
//            } else {
//                Pacote pacoteAntigo = (Pacote) objetoAntigo;
//                pacote.setItens(pacoteAntigo.getItens());
//            }

            preencherItensPacoteCategoria(pacote);

//            ItemPacoteCategoria item = (ItemPacoteCategoria) pacote.getItens().iterator().next();
//            TabelaTarifa tabelaBaixa = item.getTabela(false);
//            TabelaTarifa tabelaAlta = item.getTabela(true);
//            List<ItemTabelaTarifa> itensBaixa = tabelaBaixa.getItens();
//            List<ItemTabelaTarifa> itensAlta = tabelaAlta.getItens();
//            System.out.println("TABELA BAIXA");
//            for (ItemTabelaTarifa i : itensBaixa) {
//                System.out.println(i);
//            }
//            System.out.println("TABELA ALTA");
//            for (ItemTabelaTarifa i : itensAlta) {
//                System.out.println(i);
//            }

        }

        new DAO().salvar(objeto);
        if (fotoAcima2Mb) {
            request.getParameterMap().put("id", "" + objeto.getId());
            mensagemErro = "Arquivo superior a 2Mb. Favor escolha outro arquivo!";
            return "editar";
        }
        if (adicionouImagem) {
            request.getParameterMap().put("id", "" + objeto.getId());
            mensagemSucesso = "Arquivo adicionado com sucesso!";
            return "editar";
        } else {
            mensagemSucesso = "Salvo com sucesso!";
            return "ok";
        }
    }

    private Objeto construirObjeto() {
        Objeto objeto;
        if (id == 0) {
            if (tipo == null) {
                throw new NegocioExcecao("Não foi possível definir o tipo do objeto!");
            }
            if (tipo == TipoObjeto.PACOTE) {
                objeto = tipoPacote.getObjeto();
            } else {
                objeto = tipo.getObjeto();
            }
        } else {
            objeto = new DAO().localizar(Objeto.class, id);
        }

        objeto.setId(id);
        objeto.setTipo(tipo);
        objeto.setNome(nome);
        objeto.setAtivo(ativo);
        objeto.setTituloDescricao(tituloDescricao);
        descricao = StringUtil.formatarTextoFckEditor(descricao);
        objeto.setDescricao(descricao);
        objeto.setNomeBotao(nomeBotao);
        objeto.setIdioma(idioma);

        return objeto;
    }

    private void preencherItensPacoteCategoria(Pacote pacote) {
        List<CategoriaAcomodacao> categorias = new DAO().listar(CategoriaAcomodacao.class);
        Map parametros = request.getParameterMap();
        Set chaves = parametros.keySet();
        for (Object chave : chaves) {
            String nomeParametro = chave.toString();
            if (!ItemRequest.isItem(nomeParametro)) {
                continue;
            }
            ItemRequest itemRequest = new ItemRequest(nomeParametro, parametros.get(nomeParametro), pacote.getTipoPacote());
            itemRequest.setValor(pacote, categorias);
        }
    }

    private static class ItemRequest {

        private int idCategoria;
        private TipoAcomodacao tipoAcomodacao;
        private boolean temporada;
        private double valor;

        public ItemRequest(String parametro, Object valor, TipoPacote tipoPacote) {
            this.valor = Util.getNumero(valor.toString());

            String[] atributos = parametro.split("-");

            switch (tipoPacote) {
                case ABERTO:
                    tipoAcomodacao = TipoAcomodacao.getTipo(atributos[1]);
                    temporada = TipoTemporada.getTipo(atributos[2]).isTemporada();
                    idCategoria = Integer.parseInt(atributos[3]);
                    break;
                case FECHADO:
                    tipoAcomodacao = TipoAcomodacao.getTipo(atributos[1]);
                    idCategoria = Integer.parseInt(atributos[2]);
                    break;
            }
        }

        private void setValor(Pacote pacote, List<CategoriaAcomodacao> categorias) {
            System.out.println("preenchendo item temporada:" + temporada + " tipoAcomodacao:" + tipoAcomodacao + " valor:" + valor);
            pacote.setValor(valor, localizarCategoria(idCategoria, categorias), tipoAcomodacao, temporada);
        }

        private CategoriaAcomodacao localizarCategoria(int id, List<CategoriaAcomodacao> categorias) {
            for (CategoriaAcomodacao categoriaAcomodacao : categorias) {
                if (categoriaAcomodacao.getId() == id) {
                    return categoriaAcomodacao;
                }
            }
            throw new NegocioExcecao("Não foi possível localizar a categoria!");
        }

        private static boolean isItem(String parametro) {
            return parametro.startsWith("item");
        }
    }
}
